package com.it1997.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONException;
import com.alibaba.fastjson.JSONObject;
import org.apache.commons.io.FileUtils;
import org.apache.commons.lang.StringUtils;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class JsonUtil {
    /**
     * 解析json字符串
     * @param str
     * @return
     */
    public static JSONObject parseStr2JsonObj(String str) {
        JSONObject result = new JSONObject();
        JSONObject strJson = new JSONObject();
        try {
             strJson = JSONObject.parseObject(str);
        } catch (JSONException e) {
            throw new JSONException("参数格式不正确");
        }

        // 遍历每一组键值对
        for (Map.Entry<String, Object> entry : strJson.entrySet()) {
            if (StringUtils.isEmpty(entry.getValue().toString())) {
                continue;
            }

            if (isJsonArray(entry.getValue().toString())) {
                // 如果是json集合那就取集合下面的每一个分别去递归解析
                List list = new ArrayList();
                for (Object o : JSONObject.parseArray(entry.getValue().toString())) {
                    JSONObject jsonObject = o instanceof JSONObject ? ((JSONObject) o) : null;
                    list.add(parseStr2JsonObj(jsonObject.toString()));
                }
                result.put(entry.getKey(), list);
            } else if (isJsonObj(entry.getValue().toString())) {
                // 如果是json对象那就递归解析
                result.put(entry.getKey(), parseStr2JsonObj(entry.getValue().toString()));
            }else {
                // 不是json对象直接赋值
                result.put(entry.getKey(), entry.getValue());
            }
        }
        return result;
    }

    /**
     * 判断字符串是否是json类型的
     * @param str
     * @return
     */
    private static boolean isJsonObj(String str) {
        if (StringUtils.isBlank(str)) {
            return false;
        }
        try {
            JSONObject.parseObject(str);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    /**
     * 判断字符串是否是json集合
     * @param str
     * @return
     */
    private static boolean isJsonArray(String str) {
        if (StringUtils.isBlank(str)) {
            return false;
        }
        try {
            JSONObject.parseArray(str);
            return true;
        } catch (Exception e) {
            return false;
        }
    }

    public static void main(String[] args) throws IOException {

        File file = new File("D:/home/cxc/json.txt");
        String content = FileUtils.readFileToString(file,"UTF-8");

        JSONObject jsonObject = parseStr2JsonObj(content);
        System.out.println(jsonObject);
    }
}
